package com.itheima.proxy.cglib;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * @author 张义
 * @describe:
 * @date 2021/06/19
 */

public class ProxyTest {

    public static void main(String[] args){
        final Target target = new Target(); // 目标对象
        final Advice advice = new Advice(); // 对象增强

        // 动态生成代理对象 ， 基于 cglib
        // 1. 创建增强器
        Enhancer enhancer = new Enhancer();
        // 2. 设置父类
        enhancer.setSuperclass(Target.class);
        // 3. 设置回调
        enhancer.setCallback(new MethodInterceptor() {
            public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
                advice.before(); // 执行前置
                Object invoke = method.invoke(target , args); // 执行目标
                advice.afterReturning(); // 执行后置
                return invoke;
            }
        });
        // 4. 创建代理对象
        Target proxy = (Target) enhancer.create();
        proxy.save();
    }

}
